/**
 * 功能：处理命令行参数，计算数学表达式
 * 命令行使用方式：node calc.js <数学表达式>
 * 示例：node calc.js 1+2*3，node calc.js "Math.pow(2,5)"
 */

// 1. 获取命令行参数（process.argv 是全局数组，第一个元素是 node 路径，第二个是脚本路径，后续是用户参数）
const args = process.argv.slice(2); // 截取用户输入的参数（去掉前两个默认参数）

// 2. 定义程序使用说明（帮助信息）
const usage = `
使用说明：
  node calc.js <数学表达式>
功能：
  计算命令行输入的数学表达式，并输出结果
参数说明：
  <数学表达式>  合法的 JavaScript 数学表达式（例如 1+2*3、Math.sqrt(16)、(5+3)/2）
选项：
  -h, --help    查看帮助信息
示例：
  node calc.js 10-2*3          // 输出 4
  node calc.js "Math.pow(2,5)" // 输出 32（注意带 Math 的表达式需加引号）
  node calc.js "(10+20)/5"     // 输出 6
`;

// 3. 处理参数逻辑
// 情况1：无参数 或 参数为 -h/--help → 输出帮助信息
if (args.length === 0 || args[0] === '-h' || args[0] === '--help') {
  console.log(usage);
  process.exit(0); // 正常退出程序（状态码 0 表示无错误）
}

// 情况2：参数多于 3 个 → 忽略多余参数（只取第一个参数作为表达式）
if (args.length > 3) {
  console.log(`警告：参数数量过多（共 ${args.length} 个），仅使用第一个参数作为表达式`);
}
const expression = args[0]; // 取第一个参数作为数学表达式

// 4. 计算表达式并处理错误（例如非法表达式）
try {
  // 使用 eval() 执行表达式（注意：仅在信任的环境中使用，避免执行恶意代码）
  const result = eval(expression);

  // 验证结果是否为有效数字（排除 NaN、Infinity 等情况）
  if (typeof result === 'number' && !isNaN(result) && isFinite(result)) {
    console.log(`表达式 "${expression}" 的计算结果：${result}`);
  } else {
    console.error(`错误：表达式 "${expression}" 的结果不是有效数字`);
    process.exit(1); // 错误退出（状态码 1 表示有错误）
  }
} catch (error) {
  // 捕获语法错误
  console.error(`错误：非法的数学表达式 "${expression}"`);
  console.error(`错误详情：${error.message}`);
  process.exit(1);
}